﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using GS1.Library;
using SegIdenMovil.Entidad;
using SegIdenMovil.Herramientas;
using SegIdenMovil.Delegate;

namespace SegIdenMovil
{
    public partial class frmCambioComponente : Form
    {
        #region --- Variables y Constantes ---

        private const string TITULO = "Validación de Componentes";

        private string codigoBarraActual = string.Empty;
        
        private Item item = null;
        
        private ListaItem listaItemleida = new ListaItem();

        private ListaItemComponente listaItemComponente = new ListaItemComponente();
        #endregion

        #region --- Constructor ---
        public frmCambioComponente()
        {
            InitializeComponent();
        }
        #endregion

        #region --- Eventos Formulario ---
        private void frmCambioComponente_Load(object sender, EventArgs e)
        {
            cargarFormulario();
        }
        private void frmCambioComponente_Closing(object sender, CancelEventArgs e)
        {
            activarScanner(false);
        }

        private void mnuSalir_Click_1(object sender, EventArgs e)
        {
            salir(DialogResult.Cancel);
        }
        private void mnuGuardar_Click_1(object sender, EventArgs e)
        {
            grabar();
        }

        private void btnCambiar_Click(object sender, EventArgs e)
        {
            asignar();
        }

        #endregion

        #region --- Metodo y Evento Scanner ---
        private void activarScanner(bool estado)
        {
            if (estado)
            {
                if (ParametrosAplicacion.scanner == null) { ParametrosAplicacion.scanner = new GS1.Scanner.Scan(this); }
                ParametrosAplicacion.scanner.EscanearDato += new GS1.Scanner.Scan.EscanearDatoEventHandler(scanner_EscanearDato);
                ParametrosAplicacion.scanner.ActivarScan();
            }
            else
            {
                if (ParametrosAplicacion.scanner != null)
                {
                    ParametrosAplicacion.scanner.EscanearDato -= new GS1.Scanner.Scan.EscanearDatoEventHandler(scanner_EscanearDato);
                    if (ParametrosAplicacion.scanner.IsActive) { ParametrosAplicacion.scanner.DesActivarScan(); }
                }
            }
        }

        private void scanner_EscanearDato(string pTipo, string pDato)
        {
            // Estableciendo codigo de barras leido
            this.codigoBarraActual = pDato;
            this.txtCodigoBarraLeido.Text = pDato;
        
          //  procesarCodigoBarra();
        }
        #endregion

        #region --- Metodos Propios ---
        private void cargarFormulario()
        {
            try
            {
                Cursor.Current = Cursors.WaitCursor;
                this.WindowState = FormWindowState.Maximized;

                Utilitario.aplicarEstiloGrilla(this.lvwListado, this);

                activarScanner(true);
            }
            catch (Exception ex)
            {
                Util.MensajeError(ex, this.Text);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }

    /*    private void procesarCodigoBarra()
        {
            Item itemBuscar = null;
            String sCodComponenteLeido = string.Empty;
            if (this.item != null)
            {
                //Lee el código como si fuera el item a validar carga la pantalla y valida el estado del componente
                this.item = consultarItem(this.codigoBarraActual);
                //Consulta si el producto tiene componentes
                if (this.item.producto.componentes.Equals(Constantes.NO))
                {
                    //envia mensaje
                    Util.ShowMessageboxInfo("El Item leído no tiene componentes", TITULO);
                    this.item = null;
                    return;
                }

                //Con esta información debe llenar todos los componentes del item
                this.item = obtenerItem(this.item);

                //Carga el texto en la pantalla de producto
                this.txtDescripcion.Text = this.item.producto.descripcion;

                //Llena los datos de la grilla, estos datos se cargan una sola vez
                //En this.listaItemComponente se encuentra el componente leído por primera vez
                cargarGrilla();
            }
            else
            {
                //Se ejecuta cuando ya existe un item principal
                //usa itembuscar
                itemBuscar = consultarItem(this.codigoBarraActual);
                //si el item es igual, entonces 
                if (itemBuscar.codItem = this.item.codItem)
                {
                    ListViewItem viewItemActual = null;
                    int indice = 0;
                    //Identifica que componente ha leído busca el dato del componente 
                    foreach (ItemComponente itemComponente in this.item.listaItemComponente)
                    {
                        if (this.codigoBarraActual.Equals(itemComponente.codificacion))
                        {
                            sCodComponenteLeido = itemComponente.codComponente;
                            this.listaItemComponente.add(itemComponente);
                            break;
                        }
                    }
                    // pinta la grilla de verde
                    foreach (Componente componente in this.item.producto.listaComponente.lista)
                    {
                        if (componente.codigo.Equals(sCodComponenteLeído))
                        {
                            viewItemActual = this.lvwListado.Items[indice];
                            break;
                        }
                        indice++;
                    }
                    if (viewItemActual != null)
                    {
                        viewItemActual.BackColor = Color.Green;
                    }
                }
                //si el item no es igual, valida que sea el mismo producto
                else if (itemBuscar.producto.codigo = this.item.producto.codigo)
                {
                    ItemComponente itemComponenteLeido = null;
                    //si el producto es igual, busca el código del componente que sean iguales en this.item
                    itemBuscar = obtenerItem(itemBuscar);
                    foreach (ItemComponente itemComponente in itemBuscar.listaItemComponente)
                    {
                        if (this.codigoBarraActual.Equals(itemComponente.codificacion))
                        {
                            sCodComponenteLeido = itemComponente.codComponente;
                            this.listaItemComponente.add(itemComponente);
                            itemComponenteLeido = new ItemComponente();
                            itemComponenteLeido = itemComponente;
                            break;
                        }
                    }
                    //se imprime en el txtcodigo de barras leído el valor de lo que se leyó
                    this.txtCodigoBarraLeido.Text = this.codigoBarraActual;
                    //se imprime el código de barras de this.item del componente que le correspondía

                }
                else
                {
                    //envia mensaje
                    Util.ShowMessageboxInfo("El Item leído no es el mismo producto", TITULO);
                    return;
                }
                
                
            }
            
        }*/
        
        private Producto buscarProducto(Producto productoBuscar)
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;
            Producto productoBuscado = new Producto();
            try
            {
                //if (validarBuscar()) { return productoBuscado; }

                Cursor.Current = Cursors.WaitCursor;

                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();
                operacion.numero = Constantes.OPERACION_OBTENER_PRODUCTO;

                operacion.producto = new Producto();
                operacion.producto = productoBuscar;

                operacion.tienda = new Tienda();
                operacion.tienda = ParametrosAplicacion.TIENDA_ACTUAL;

                // Instanciando y ejecutando llamada al ServicioREST
                using (ConexionREST conexionREST = new ConexionREST())
                {
                    contenidoXML = conexionREST.ejecutarOperacion(operacion);
                }

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Util.ShowMessageboxError(operacionError.descripcion);
                    return productoBuscado;
                }

                // Obteniendo Objeto de Listado
                productoBuscado = contenidoXML.DeserializarTo<Producto>();
                return productoBuscado;
            }
            catch (Exception ex)
            {
                Util.MensajeError(ex, this.Text);
                return productoBuscado;
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }

        
  
     /*   private void cargarGrilla()
        {
            ListViewItem viewItemActual = null;
            int indice = 0;
            String sCodComponenteLeido = string.Empty;
            try
            {
                Cursor.Current = Cursors.WaitCursor;
                this.WindowState = FormWindowState.Maximized;

                //Identifica que componente ha leído
                foreach (ItemComponente itemComponente in this.item.listaItemComponente)
                    {
                        if (this.codigoBarraActual.Equals(itemComponente.codificacion))
                        {
                            sCodComponenteLeido = itemComponente.codComponente;
                            this.listaItemComponente.add(itemComponente);
                            break;
                        }
                    }

                // Se agrega muestra el detalle de lista de componentes
                this.lvwListado.BeginUpdate();
                this.lvwListado.Items.Clear();

                ListViewItem nuevoItem = null;

                // Cargar los componentes a listado
                foreach (Componente componente in this.item.producto.listaComponente.lista)
                {
                    nuevoItem = new ListViewItem(componente.descripcion);
                    nuevoItem.SubItems.Add(componente.codigo);
                    //se debe marcar el componente leído
                    if (componente.codigo = sCodComponenteLeido)
                    {
                        nuevoItem.BackColor = Color.Green;
                    }
                    //Agrega el componente al listado, sea nuevo o ya cargado
                    this.lvwListado.Items.Add(nuevoItem);
                }
                this.lvwListado.EndUpdate();

                // Se aplica estilo a listview
                Utilitario.aplicarEstiloGrilla(this.lvwListado, this);
                
            }
            catch (Exception ex)
            {
                Util.MensajeError(ex, this.Text);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }*/

        private Boolean validarCodigo()
        {
            if (this.item != null)
            {
                foreach (ItemComponente itemComponente in this.item.listaItemComponente.lista)
                {
                    if (itemComponente.codificacion.Equals(this.codigoBarraActual))
                    {
                        return true;
                    }
                }
            }
            return false;
        }

        private Item consultarItem(string codigoitem)
        {
            //Item item = null;
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_CONSULTAR_ITEM;
            operacion.item = new Item { codificacion = codigoitem };

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Util.ShowMessageboxError(operacionError.descripcion);
                return null;
            }

            // Obteniendo Objeto de Producto
           // item = contenidoXML.DeserializarTo<Item>();
              this.item = contenidoXML.DeserializarTo<Item>();
            return item;

        }

        private void asignar()
        {
            Operacion operacion = null;

            string contenidoXML = string.Empty;

            try
            {
                Cursor.Current = Cursors.WaitCursor;

                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();
                //Se registra el cambio en el item
               
                operacion.numero = Constantes.OPERACION_MODIFICAR_ITEM_COMPONENTE;
                operacion.item = this.item;
                operacion.item.codItem = this.item.codItem;
                operacion.item.codificacion = this.txtCodigoBarraLeido.Text;


                // Instanciando y ejecutando llamada al ServicioREST
                using (ConexionREST conexionREST = new ConexionREST())
                {
                    contenidoXML = conexionREST.ejecutarOperacion(operacion);
                }

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Util.ShowMessageboxError(operacionError.descripcion);
                    return;
                }

                OperacionResultado operacionResultado = contenidoXML.DeserializarTo<OperacionResultado>();

                if ((operacionResultado != null) &&
                    (operacionResultado.esOK.Equals(Constantes.SI)))
                {
                    Util.ShowMessageboxInfo("El Item fue modificado correctamente");
                }
                else
                {
                    Util.ShowMessageboxError("No se guardo los datos");
                    return;
                }
                
            }
            catch (Exception ex)
            {
                Util.MensajeError(ex, this.Text);
            }
            finally
            {
              Cursor.Current = Cursors.Default;
            } 
        }

        private Item obtenerItem(Item itemObtener)
        {
            Item item = null;
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_OBTENER_ITEM;
            operacion.item = itemObtener;

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Util.ShowMessageboxError(operacionError.descripcion);
                return null;
            }

            // Obteniendo Objeto de Producto
            item = contenidoXML.DeserializarTo<Item>();

            return item;

        }

        //VALIDAR COMENTARIOS segunda actualización
        private void grabar()
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;
            

            try
            {
                Cursor.Current = Cursors.WaitCursor;

                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();
                //Se registra el cambio en el item
               
                operacion.numero = Constantes.OPERACION_MODIFICAR_ITEM_COMPONENTE;
                operacion.item = this.item;
                operacion.item.codItem = this.item.codItem;
                operacion.item.codificacion = this.txtCodigoBarrasCambiado.Text;

            
                operacion.item.codItem = this.item.codItem;
                operacion.item.codificacion = this.txtCodigoBarraLeido.Text;


                // Instanciando y ejecutando llamada al ServicioREST
                using (ConexionREST conexionREST = new ConexionREST())
                {
                    contenidoXML = conexionREST.ejecutarOperacion(operacion);
                }

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Util.ShowMessageboxError(operacionError.descripcion);
                    return;
                }

                OperacionResultado operacionResultado = contenidoXML.DeserializarTo<OperacionResultado>();

                if ((operacionResultado != null) &&
                    (operacionResultado.esOK.Equals(Constantes.SI)))
                {
                    Util.ShowMessageboxInfo("El Item fue modificado correctamente");
                }
                else
                {
                    Util.ShowMessageboxError("No se guardo los datos");
                    return;
                }
               
            }
            catch (Exception ex)
            {
                Util.MensajeError(ex, this.Text);
            }
            finally
            {
              Cursor.Current = Cursors.Default;
            } 
        }

        private void limpiar()
        {

            this.txtCodigoBarraLeido.Text = string.Empty;
            this.txtCodigoBarrasCambiado.Text = string.Empty;


        }



        private void salir(DialogResult resultado)
        {
            this.DialogResult = resultado;
        }

        #endregion

    }
}